#include <iostream>
#include <set>
#include <list>
#include <iterator>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;


const string no_op("Impossible");

long ReadLong() {
	long X;
	cin >> X;
	return X;
}

void Compute(const multiset<long>& P_const, list<long>& N) {
	multiset<long>::const_iterator Pi = P_const.begin();
	long p0 = *(Pi); Pi++;	
	long p1 = *(Pi); Pi++;	
	while(Pi != P_const.end() && N.empty() == true) { 
		N.push_back((p0+p1-*Pi)/2);
		multiset<long> P(P_const);
		bool impossible = false; 
		while(P.empty() == false) {
			list<long>::const_iterator it = N.begin();
			long next = *(P.begin()) - *it;
			while(it != N.end()) {
				multiset<long>::iterator pos = (P.find(next + *it));
				if (pos != P.end())
					P.erase(pos);
				else {
					N.clear();
					impossible = true;
					break;
				}
				it++;
			}
			if(impossible == true) break;
			N.push_back(next);
		}
		Pi++;
	}
}

/* main
 *  * */
int main() {
	std::ios_base::sync_with_stdio (true);
	multiset<long> P;
	list<long> N;
	short n;
	cin >> n;
	do {
		P.clear();
		N.clear();
		generate_n (inserter(P, P.end()), (n*(n-1))/2, ReadLong);
		Compute(P, N);
		if(N.empty() == false) {
			while(N.size() != 1) {
				cout << N.front() << " ";
				N.pop_front();
			}
			cout << N.front();
		} else {
			cout << no_op;
		}
		cout << endl;
		cin >> n;
	} while(cin.eof() == false);
	return 0;
}
